﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using Entities;
using System.Text;

namespace Subfaculty.Helpers
{
    // !!!!!!!!!!!!!!!!!!!!!!Рефакторить!!!!!!!!!!!!
    public static class myHelpers
    {
        // Разметка для списка выбора элементов УП
        public static MvcHtmlString CheckBoxSelectSPIList(this HtmlHelper html, IList<StudyPlanItem> itemList)
        {
            StringBuilder str = new StringBuilder();
            if (itemList.Count > 0)
            {
                foreach (StudyPlanItem item in itemList)
                {
                    str.Append("<li>");
                    str.Append(String.Format("<label for='spi_{0}'><input type='checkbox' name='spi_{0}' value='{0}' id='spi_check_{0}' />&nbsp;&nbsp;{1}</label>", item.Id, item.Discipline.DisciplineTitle + "  (Направление : "  + item.Direction.DirectionTitle + ")"));
                    str.Append("</li>");
                }
            }else
            {
                str.Append("<p>Нет элементов для объединения</p>");
            }

            return MvcHtmlString.Create(str.ToString());
        }

        // Разметка для списка выбора групп
        public static MvcHtmlString CheckBoxSelectGroup(this HtmlHelper html, IList<Group> itemList)
        {
            StringBuilder str = new StringBuilder();
            if (itemList.Count > 0)
            {
                IOrderedEnumerable<Group> orderedGroupList = itemList.OrderBy(group => group.GroupTitle);
                foreach (Group item in orderedGroupList)
                {
                    str.Append("<li>");
                    str.Append(String.Format("<label for='spi_{0}'><input type='checkbox' name='group_{0}' value='{0}' id='group_check_{0}' />&nbsp;&nbsp;{1}</label>", item.Id, item.GroupTitle + " : " + item.Direction.DirectionTitle));
                    str.Append("</li>");
                }
            }
            else
            {
                str.Append("<p>Нет элементов для объединения</p>");
            }

            return MvcHtmlString.Create(str.ToString());
        }

        // Разметка для таблицы выбора элемента УП
        public static MvcHtmlString StudyPlanItemTable(this HtmlHelper html, IList<StudyPlanItem> itemList)
        {
            StringBuilder str = new StringBuilder();
            str.Append("<p>");
            if (itemList.Count > 0)
            {
                str.Append("<table align='center'>");
                IList<String> titleList = new List<String>();
                titleList.Add(""); titleList.Add("Дисциплина"); titleList.Add("Кафедра"); titleList.Add("Семестр");
                titleList.Add("Лекции"); titleList.Add("Лаб.работы"); titleList.Add("Практики"); titleList.Add("СРС");
                titleList.Add("Форма СРС"); titleList.Add("Форма контроля");
                str.Append(html.DisplayTitleForTable(titleList));

                foreach (StudyPlanItem item in itemList)
                {
                    str.Append("<tr>");
                    str.Append(String.Format("<td><input type='radio' name='radioSPI' id='spi_radio_{0}' /></td>", item.Id));
                    str.Append(String.Format("<td>{0}</td>", item.Discipline.DisciplineTitle));
                    str.Append(String.Format("<td>{0}</td>", item.Department.DepartmentTitle));
                    str.Append(String.Format("<td>{0}</td>", item.Semestr));
                    str.Append(String.Format("<td>{0}</td>", item.HoursLecture));
                    str.Append(String.Format("<td>{0}</td>", item.HoursLaboratory));
                    str.Append(String.Format("<td>{0}</td>", item.HoursPractice));
                    str.Append(String.Format("<td>{0}</td>", item.HoursSRS));
                    str.Append(String.Format("<td>{0}</td>", item.TypeSRS));
                    str.Append(String.Format("<td>{0}</td>", item.ControlType));
                    str.Append("</tr>");
                }
                str.Append("</table>");
            }
            else
            {
                str.Append("<div align='center'>Нет элементов учебного плана для данного направления!</div>");
            }
            str.Append("</p>");
            return MvcHtmlString.Create(str.ToString());
        }

        // Разметка для заголовка таблицы (itemList - заголовки столбцов)
        public static MvcHtmlString DisplayTitleForTable(this HtmlHelper html, IList<String> itemList)
        {
            StringBuilder str = new StringBuilder();
            str.Append("<tr>");
            foreach (String item in itemList)
                str.Append(String.Format("<th>{0}</th>", item));
            str.Append("</tr>");
            return MvcHtmlString.Create(str.ToString());
        }

        // Формирование разметки для дерева нераспределенной нагрузки !!!!(РЕФАКТОРИТЬ - выделить общие части со вторым деревом)
        public static MvcHtmlString notDistributedLoadList(this HtmlHelper html, IList<LoadAtom> atomList)
        {
            IList<LoadAtom> tempAtomList; // для хранения атомов конкретной дисциплины
            IList<LoadAtom> tempAtomList2; // для хранения атомов с одинаковым типом нагрузки
            IDictionary<String, String> loadTypeDictionary = new Dictionary<String, String>();
            loadTypeDictionary.Add("Лекции","Lectures");
            loadTypeDictionary.Add("Практики", "Practices");
            loadTypeDictionary.Add("Лабораторные", "Labs");
            StringBuilder strB = new StringBuilder();

            strB.Append("<ul>");
            strB.Append("<li id=\"root\" rel='root' title='root'><a>Нераспределенная нагрузка</a> ");
            strB.Append("<ul>");
            // Получаем список дисциплин, для которых имеется нераспределенная нагрузка
            IList<Discipline> disciplineList = (from s in atomList
                                                from x in s.Allocation.StudyPlanItems
                                                select x.Discipline).Distinct().ToList(); 

            foreach (Discipline discipline in disciplineList)
            {
                strB.Append(String.Format("<li id='discipline{0}' title='discipline' rel='discipline' name='{0}'><a href='#'>{1}</a>", discipline.Id, discipline.DisciplineTitle));
                strB.Append("<ul>");

                tempAtomList = (from s in atomList
                                from x in s.Allocation.StudyPlanItems
                                where x.Discipline.Id == discipline.Id
                                select s).Distinct().ToList();
                // Получаем список типов нагрузки, для которых имеется нераспределенная нагрузка
                IList<String> loadTypeList = (from s in tempAtomList
                                              select s.LoadType).Distinct().ToList();
                foreach (String loadType in loadTypeList)
                {
                    strB.Append(String.Format("<li id='loadType{1}{0}' name='{0}_{1}' title='loadType' rel='loadType'><a href='#'>{2}</a>", loadTypeDictionary[loadType], discipline.Id, loadType));
                    strB.Append("<ul>");
                    tempAtomList2 = (from s in tempAtomList                                     
                                     where s.LoadType == loadType
                                     select s).Distinct().ToList();                    
                    // Перебираем все элементы с данным типом нагрузки
                    foreach (LoadAtom loadAtom in tempAtomList2)
                    {
                        String groupList = "";
                        foreach (Group group in loadAtom.Groups)
                        {
                            if (loadAtom.GroupRelationType.StartsWith("halfGroup") == true)
                            {
                                groupList += String.Format("{0}(подгруппа{1}), ", group.GroupTitle, loadAtom.GroupRelationType.Substring(loadAtom.GroupRelationType.Length - 1, 1));
                            }
                            else
                                groupList += group.GroupTitle + ", ";
                        }
                        groupList = groupList.Remove(groupList.Length - 2, 2) + String.Format("({0} ч.)", loadAtom.Hours);                        
                        strB.Append(String.Format("<li id='loadAtom{0}' title='loadAtom' rel='loadAtom' name='{0}'><a href='#'>{1}</a>", loadAtom.Id, groupList));
                        strB.Append("</li>");
                    }
                    strB.Append("</ul>");
                    strB.Append("</li>");  
                }
                strB.Append("</ul>");
                strB.Append("</li>");                
            }
            strB.Append("</ul>");
            strB.Append("</li>");
            strB.Append("</ul>");

            return MvcHtmlString.Create(strB.ToString());
        }

        // Формирование разметки для дерева нераспределенной нагрузки для разделения атомов !!!!(РЕФАКТОРИТЬ - выделить общие части со вторым деревом)
        public static MvcHtmlString LoadTreeForDivideList(this HtmlHelper html, IList<LoadAtom> atomList)
        {
            IList<LoadAtom> tempAtomList; // для хранения атомов конкретной дисциплины
            IList<LoadAtom> tempAtomList2; // для хранения атомов с одинаковым типом нагрузки
            IDictionary<String, String> loadTypeDictionary = new Dictionary<String, String>();
            loadTypeDictionary.Add("Лекции", "Lectures");
            loadTypeDictionary.Add("Практики", "Practices");
            loadTypeDictionary.Add("Лабораторные", "Labs");
            StringBuilder strB = new StringBuilder();

            strB.Append("<ul>");
            strB.Append("<li id=\"div_root\" rel='div_root' title='div_root'><a>Нераспределенная нагрузка</a> ");
            strB.Append("<ul>");
            // Получаем список дисциплин, для которых имеется нераспределенная нагрузка
            IList<Discipline> disciplineList = (from s in atomList
                                                from x in s.Allocation.StudyPlanItems
                                                select x.Discipline).Distinct().ToList();

            foreach (Discipline discipline in disciplineList)
            {
                strB.Append(String.Format("<li id='div_discipline{0}' title='div_discipline' rel='div_discipline' name='{0}'><a href='#'>{1}</a>", discipline.Id, discipline.DisciplineTitle));
                strB.Append("<ul>");

                tempAtomList = (from s in atomList
                                from x in s.Allocation.StudyPlanItems
                                where x.Discipline.Id == discipline.Id
                                select s).Distinct().ToList();
                // Получаем список типов нагрузки, для которых имеется нераспределенная нагрузка
                IList<String> loadTypeList = (from s in tempAtomList
                                              select s.LoadType).Distinct().ToList();
                foreach (String loadType in loadTypeList)
                {
                    strB.Append(String.Format("<li id='div_loadType{1}{0}' name='div_{0}_{1}' title='div_loadType' rel='div_loadType'><a href='#'>{2}</a>", loadTypeDictionary[loadType], discipline.Id, loadType));
                    strB.Append("<ul>");
                    tempAtomList2 = (from s in tempAtomList
                                     where s.LoadType == loadType
                                     select s).Distinct().ToList();
                    // Перебираем все элементы с данным типом нагрузки
                    foreach (LoadAtom loadAtom in tempAtomList2)
                    {
                        String groupList = "";
                        foreach (Group group in loadAtom.Groups)
                        {
                            if (loadAtom.GroupRelationType.StartsWith("halfGroup") == true)
                            {
                                groupList += String.Format("{0}(подгруппа{1}), ", group.GroupTitle, loadAtom.GroupRelationType.Substring(loadAtom.GroupRelationType.Length - 1, 1));
                            }
                            else
                                groupList += group.GroupTitle + ", ";
                        }
                        groupList = groupList.Remove(groupList.Length - 2, 2) + String.Format("({0} ч.)", loadAtom.Hours);                        
                        strB.Append(String.Format("<li id='div_loadAtom{0}' title='div_loadAtom' rel='div_loadAtom' name='{0}_{2}'><a href='#'>{1}</a>", loadAtom.Id, groupList, loadAtom.Hours));
                        strB.Append("</li>");
                    }
                    strB.Append("</ul>");
                    strB.Append("</li>");
                }
                strB.Append("</ul>");
                strB.Append("</li>");
            }
            strB.Append("</ul>");
            strB.Append("</li>");
            strB.Append("</ul>");

            return MvcHtmlString.Create(strB.ToString());
        }


        // Формирование разметки для дерева распределенной нагрузки
        public static MvcHtmlString distributedLoadList(this HtmlHelper html, IList<LoadAtom> atomList, Teacher currentTeacher)
        {
            IList<LoadAtom> tempAtomList; // для хранения атомов конкретной дисциплины
            IList<LoadAtom> tempAtomList2; // для хранения атомов с одинаковым типом нагрузки
            IDictionary<String, String> loadTypeDictionary = new Dictionary<String, String>();
            loadTypeDictionary.Add("Лекции", "Lectures");
            loadTypeDictionary.Add("Практики", "Practices");
            loadTypeDictionary.Add("Лабораторные", "Labs");
            StringBuilder strB = new StringBuilder();

            strB.Append("<ul>");
            if (currentTeacher != null)
            {
                strB.Append("<li id='teacher" + currentTeacher.Id + "' rel='teacher' title='teacher' name='" + currentTeacher.Id + "'><a>" + currentTeacher.Family + " " + currentTeacher.Name.Substring(0, 1) + "." + currentTeacher.Patronymic.Substring(0, 1) + "." + "</a> ");
            }
            else
            {
                strB.Append("<li id=\"teacher\" rel='teacher'><a>" + "Преподаватель не выбран!" + "</a>");
            }
            strB.Append("<ul>");
            // Получаем список дисциплин, для которых имеется нераспределенная нагрузка
            IList<Discipline> disciplineList = (from s in atomList
                                                from x in s.Allocation.StudyPlanItems
                                                select x.Discipline).Distinct().ToList();
            foreach (Discipline discipline in disciplineList)
            {
                strB.Append(String.Format("<li id='distrDiscipline' title='distrDiscipline' name='{0}' rel='distrDiscipline'><a href='#'>{1}</a>", discipline.Id, discipline.DisciplineTitle));
                strB.Append("<ul>");

                tempAtomList = (from s in atomList
                                from x in s.Allocation.StudyPlanItems
                                where x.Discipline.Id == discipline.Id
                                select s).Distinct().ToList();
                // Получаем список типов нагрузки, для которых имеется нераспределенная нагрузка
                IList<String> loadTypeList = (from s in tempAtomList
                                              select s.LoadType).Distinct().ToList();
                foreach (String loadType in loadTypeList)
                {
                    strB.Append(String.Format("<li id='distrLoadType'  name='{0}_{1}' title='distrLoadType' rel='distrLoadType'><a href='#'>{2}</a>", loadTypeDictionary[loadType], discipline.Id, loadType));
                    strB.Append("<ul>");
                    tempAtomList2 = (from s in tempAtomList
                                     where s.LoadType == loadType
                                     select s).Distinct().ToList();
                    // Перебираем все элементы с данным типом нагрузки
                    foreach (LoadAtom loadAtom in tempAtomList2)
                    {
                        String groupList = "";
                        foreach (Group group in loadAtom.Groups)
                        {
                            if (loadAtom.GroupRelationType.StartsWith("halfGroup") == true)
                            {
                                groupList += String.Format("{0}(подгруппа{1}), ", group.GroupTitle, loadAtom.GroupRelationType.Substring(loadAtom.GroupRelationType.Length - 1, 1));
                            }
                            else
                                groupList += group.GroupTitle + ", ";
                        }
                        groupList = groupList.Remove(groupList.Length - 2, 2) + String.Format("({0} ч.)", loadAtom.Hours);
                        strB.Append(String.Format("<li id='distrLoadAtom{0}' title='distrLoadAtom' rel='distrLoadAtom' name='{0}'><a href='#'>{1}</a>", loadAtom.Id, groupList));
                        strB.Append("</li>");
                    }
                    strB.Append("</ul>");
                    strB.Append("</li>");
                }
                strB.Append("</ul>");
                strB.Append("</li>");
            }
            strB.Append("</ul>");
            strB.Append("</li>");
            strB.Append("</ul>");

            return MvcHtmlString.Create(strB.ToString());
        }

        // Разметка меню для выбора преподавателя
        public static MvcHtmlString teacherList(this HtmlHelper html, IList<Teacher> teachersList)
        {
            StringBuilder str = new StringBuilder();
            IOrderedEnumerable<Teacher> orderedTeacherList = teachersList.OrderBy(teacher => teacher.Family);
            int checkedTeacherId = orderedTeacherList.First().Id;
            str.Append("<form>");
            foreach (Teacher teacher in orderedTeacherList)
            {
                String _checked = "  ";
                if (teacher.Id == checkedTeacherId)
                    _checked = " checked=\"checked\" ";
                str.Append(String.Format("<input type='radio' id='radio{0}' name='radio' {2} /><label for='radio{0}' id='{0}' class='teacher'>{1}</label><br />", 
                                          teacher.Id, teacher.Family + " " + teacher.Name.Substring(0,1) + "." + teacher.Patronymic.Substring(0,1) + ".", _checked));
            }
            str.Append("</form>");
            return MvcHtmlString.Create(str.ToString());
        }
    }
}